Fix const correctness bug in bind involving reference_wrapper found by Jonathan Sauer git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@131852 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/functional b/include/functional index aa2b492..03e2c81 100644 --- a/include/functional +++ b/include/functional 
@@ -1567,24 +1567,31 @@  return __ti;  }   -template <class _Ti, bool IsBindEx, bool IsPh, class _TupleUj> +template <class _Ti, bool IsReferenceWrapper, bool IsBindEx, bool IsPh, + class _TupleUj>  struct ____mu_return;    template <class _Ti, class ..._Uj> -struct ____mu_return<_Ti, true, false, tuple<_Uj...> > +struct ____mu_return<_Ti, false, true, false, tuple<_Uj...> >  {  typedef typename __invoke_of<_Ti&, _Uj...>::type type;  };    template <class _Ti, class _TupleUj> -struct ____mu_return<_Ti, false, true, _TupleUj> +struct ____mu_return<_Ti, false, false, true, _TupleUj>  {  typedef typename tuple_element<is_placeholder<_Ti>::value - 1,  _TupleUj>::type&& type;  };    template <class _Ti, class _TupleUj> -struct ____mu_return<_Ti, false, false, _TupleUj> +struct ____mu_return<_Ti, true, false, false, _TupleUj> +{ + typedef typename _Ti::type& type; +}; + +template <class _Ti, class _TupleUj> +struct ____mu_return<_Ti, false, false, false, _TupleUj>  {  typedef _Ti& type;  }; @@ -1592,18 +1599,13 @@  template <class _Ti, class _TupleUj>  struct __mu_return  : public ____mu_return<_Ti, + __is_reference_wrapper<_Ti>::value,  is_bind_expression<_Ti>::value,  0 < is_placeholder<_Ti>::value,  _TupleUj>  {  };   -template <class _Ti, class _TupleUj> -struct __mu_return<reference_wrapper<_Ti>, _TupleUj> -{ - typedef _Ti& type; -}; -  template <class _F, class _BoundArgs, class _TupleUj>  struct __bind_return;